package cn.edu.scau.cmi.xiaozhenlin.composite;

import java.util.ArrayList;
import java.util.List;

/**
 * 目录
 */
public class SafeComposite extends SafeComponent {

	/**
	 * 存储组合对象中包含的子组件的对象（可能是目录也可能是文件）
	 */
	private List<SafeComponent> childComponents = new ArrayList<>();

	/**
	 * 组合对象的名称
	 */
	private String name;

	/**
	 * 构件名称
	 * 
	 * @param name
	 */
	public SafeComposite(String name) {
		this.name = name;
	}

	/**
	 * 输出对象的自身结构
	 * 
	 * @param preStr
	 *            前缀，主要是按照层级拼接空格，实现向后缩进
	 */
	public StringBuilder printStruct() {
		// 先把自己输出
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.append("+ " + this.name + "\n");
		// 如果还包含有子组件，那么就输出这些子组件对象
		if (this.childComponents != null) {
			// 输出当前对象的子对象
			for (SafeComponent c : childComponents) {
				// 递归输出每个子对象
				stringBuilder.append("  - " + c.getName() + "\n");
			}
		}
		return stringBuilder;
	}

	/**
	 * 聚集管理方法，增加一个子构件对象
	 * 
	 * @param child
	 *            子构件对象
	 */
	public void addChild(SafeComponent child) {
		childComponents.add(child);
	}

	/**
	 * 聚集管理方法，删除一个子构件对象
	 * 
	 * @param index
	 *            子构件对象的下标
	 */
	public void removeChild(String n) {
		for (int i = 0; i < childComponents.size(); i++) {
			if (childComponents.get(i).getName().equals(n)) {
				childComponents.remove(i);
			}
		}
	}

	/**
	 * 聚集管理方法，返回所有子构件对象
	 */
	public List<SafeComponent> getChild() {
		return childComponents;
	}

	@Override
	public String getName() {
		// TODO 自动生成的方法存根
		return this.name;
	}
}
